/**
 * Copyright (c) 2018-2022, NXOS Development Team
 * SPDX-License-Identifier: Apache-2.0
 * 
 * Contains: byte order ops
 * 
 * Change Logs:
 * Date           Author            Notes
 * 2022-08-16     JasonHu           Init
 */

#ifndef __UTILS_BYTEORDER_H__
#define __UTILS_BYTEORDER_H__

#include <nxos/types.h>
#include <nxos/defines.h>

NX_INLINE NX_U16 __ByteSwap16(NX_U16 data)
{
    return (NX_U16)((data & 0xFF) << 8) | ((data & 0xFF00) >> 8);
}

NX_INLINE NX_U32 __ByteSwap32(NX_U32 data)
{
    return (NX_U32)((data & 0xFF) << 24) | ((data & 0xFF00) << 8) | \
        ((data & 0xFF0000) >> 8) | ((data & 0xFF000000) >> 24);
}

NX_INLINE int __IsBigEndian(void)
{  
    short s = 0x0110;  
    char *p = (char *) &s;  
    return !(p[0] == 0x10);
}

NX_INLINE NX_U16 NX_CpuToLe16(NX_U16 data)
{
    if (__IsBigEndian()) {
        return __ByteSwap16(data);
    } else {
        return data;
    }
}

NX_INLINE NX_U32 NX_CpuToLe32(NX_U32 data)
{
    if (__IsBigEndian()) {
        return __ByteSwap32(data);
    } else {
        return data;
    }
}

NX_INLINE NX_U16 NX_CpuToBe16(NX_U16 data)
{
    if (__IsBigEndian()) {
        return data;
    } else {
        return __ByteSwap16(data);
    }
}

NX_INLINE NX_U32 NX_CpuToBe32(NX_U32 data)
{
    if (__IsBigEndian()) {
        return data;
    } else {
        return __ByteSwap32(data);
    }
}

NX_INLINE NX_U16 NX_Be16ToCpu(NX_U16 data)
{
    if (__IsBigEndian()) {
        return data;
    } else {
        return __ByteSwap16(data);
    }
}

NX_INLINE NX_U32 NX_Be32ToCpu(NX_U32 data)
{
    if (__IsBigEndian()) {
        return data;
    } else {
        return __ByteSwap32(data);
    }
}

NX_INLINE NX_U16 NX_Le16ToCpu(NX_U16 data)
{
    if (__IsBigEndian()) {
        return __ByteSwap16(data);
    } else {
        return data;
    }
}

NX_INLINE NX_U32 NX_Le32ToCpu(NX_U32 data)
{
    if (__IsBigEndian()) {
        return __ByteSwap32(data);
    } else {
        return data;
    }
}

#endif /* __UTILS_BYTEORDER_H__ */
